package net.servir.capacidades.web.controller;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import net.servir.capacidades.model.Profesion;
import net.servir.capacidades.model.Regimen;
import net.servir.capacidades.model.Responsable;
import net.servir.capacidades.model.ResponsableBusqueda;
import net.servir.capacidades.model.RptResponsableBusqueda;
import net.servir.capacidades.model.Sistema;
import net.servir.capacidades.model.SistemaEtapa;
import net.servir.capacidades.model.Usuario;
import net.servir.capacidades.model.jsp.JspResponsableEdicion;
import net.servir.capacidades.service.CapacidadesService;
import net.servir.capacidades.service.CensoService;
//import net.servir.capacidades.model.Persona;
//import net.servir.capacidades.service.ws.impl.SRELServiceWSImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ResponsableBusquedaController {

	@Autowired
	private CapacidadesService capacidadesService;
	@Autowired
	private CensoService censoService;

	// private SRELServiceWSImpl sRELServiceWS;
	@RequestMapping("/responsableBusqueda.htm")
	public @ModelAttribute("responsableBusqueda")
	ResponsableBusqueda censo(HttpServletRequest request) throws Exception {

		ResponsableBusqueda obj = new ResponsableBusqueda();
		// sRELServiceWS = new SRELServiceWSImpl();
		// ************************************************************
		// se obtiene el dni de la session activa
		// ************************************************************
		HttpSession session = request.getSession();
		// String cod_session =session.getId();

		String dniUsuario = null;
		if (session.getAttribute("dni") != null)
			dniUsuario = session.getAttribute("dni").toString();

		// Obtenemos los datos del responsable
		Usuario usuario = null;
		if (session.getAttribute("usuario") != null)
			usuario = (Usuario) session.getAttribute("usuario");

		if (usuario == null)
			throw new Exception("No se ha identificado al usuario");

		obj.setUsuario(usuario);
		obj.setFiltroFuncionesPersonalizadas("0");

		// ************************************************************

		session.setAttribute("OBJ_SC_BUSQ", null);
		session.setAttribute("OBJ_PARTIC_BUSQ", null);

		// Persona persona;
		// persona = sRELServiceWS.getPersona("10243093");

		String coddep = null;
		String codpro = null;
		String coddis = null;
		String accion = null;
		String conAmbito = "0";
		String codEstadosResponsable = null;
		// Boolean conCriteriosBusqueda = false;
		Integer idNivelGobierno = 0;
		Integer idSector = 0;
		Integer idEjecutora = null;
		Integer idSistema = null;
		Integer idResponsable = null;
		// variable juank
		String codRegimen = "";
		String codProfesion = "";
		// Se agrega filtro con funciones personalizadas
		String funcionesPersonalizadas = "";
		String correo = "";
		String fecRegistro = "";
		String fecValidacion = "";
		String fecRegistroFin = "";
		String fecValidacionFin = "";
		String fecHabilita = "";
		String fecHabilitaFin = "";
		String procedencia = "";
		Boolean adCorreo = false;
		Boolean adParticipante = false;
		Boolean adFechaFinalizacionMasiva = false;
		Boolean adHabilitacionMasiva = false;
		// String descripcionAmbito = "";
		ResponsableBusqueda objPrevio = null;
		// obtener valores del accion de usuario
		coddep = request.getParameter("coddep");
		codpro = request.getParameter("codpro");
		coddis = request.getParameter("coddis");
		codEstadosResponsable = request.getParameter("codEstadosResponsable");
		accion = request.getParameter("accion");
		String fechaFinalizacion = "";
		Number total = 0 ;
		String fecHabilitacion = "";
		String plazo = "";
		
//		System.out.println("accion realizada : " + accion);
		// Ver de donde procede el llamado a la página
		if (request.getParameter("procedencia") != null)
			procedencia = request.getParameter("procedencia");

		// si el obj de la pagina previa es null ( no se hizo busqueda ejecutar
		// el flujo normal)
		if ((ResponsableBusqueda) session.getAttribute("OBJ_RESP_BUSQ") == null)
			procedencia = "";

		if (accion != null && accion.equals("ADICIONAR_CORREO")) {
			procedencia = "RESP_EDICION";
			adCorreo = true;
			accion = "BUSCAR";
		}

		if (accion != null && accion.equals("ADICIONAR_PARTICIPANTE")) {
			procedencia = "RESP_EDICION";
			adParticipante = true;
			accion = "BUSCAR";
		}
		
		if (accion != null && accion.equals("FECHAFINALIZACIONMASIVA")) {
			procedencia = "BUSQUEDA";
			adFechaFinalizacionMasiva = true;
			accion = "BUSCAR";
			if (request.getParameter("fechaFinalizacion") != null
					& !request.getParameter("fechaFinalizacion").equals(""))
				fechaFinalizacion = request.getParameter("fechaFinalizacion");
		}
		
		if (accion != null && accion.equals("HABILITACIONMASIVA")) {
			procedencia = "BUSQUEDA";
			adHabilitacionMasiva = true;
			accion = "BUSCAR";
			if (request.getParameter("inputFechaInicioHabilitacion") != null
					& !request.getParameter("inputFechaInicioHabilitacion").equals(""))
				fecHabilitacion = request.getParameter("inputFechaInicioHabilitacion");
			if (request.getParameter("inputPlazoHabilitacion") != null
					& !request.getParameter("inputPlazoHabilitacion").equals(""))
				plazo = request.getParameter("inputPlazoHabilitacion");
		}
		
		if (!procedencia.equals("RESP_EDICION")) {

			/*
			 * ================================ llenando los combos profesiones
			 * y regimenes================================
			 */
			LinkedList<Profesion> profesions = capacidadesService
					.ObtenerProfesion();
			LinkedList<Regimen> regimens = capacidadesService.ObtenerRegimen();
			obj.setRegimens(regimens);
			obj.setProfesions(profesions);

			// Obtener combos

			obj.setOptEstadosResponsable(capacidadesService
					.ObtenerEstadosResponsable());
			obj.setOptEstadosInscritos(capacidadesService
					.ObtenerEstadosInscritos());
			obj.setOptEstadosPlazo(capacidadesService.ObtenerEstadosPlazo());

			// Valores del formulario
			if (request.getParameter("codEstadosResponsable") != null)
				obj.setCodEstadosResponsable(request
						.getParameter("codEstadosResponsable"));
			if (request.getParameter("codEstadosPlazo") != null)
				obj.setCodEstadosPlazo(request.getParameter("codEstadosPlazo"));
			if (request.getParameter("codEstadosInscritos") != null)
				obj.setCodEstadosInscritos(request
						.getParameter("codEstadosInscritos"));

			obj.setFiltroSinEjecutora("0");
			if (request.getParameter("filtroSinEjecutora") != null)
				obj.setFiltroSinEjecutora(request
						.getParameter("filtroSinEjecutora"));
			// Se agrega el filtro funciones personalizadas

			obj.setFiltroFuncionesPersonalizadas("0");
			if (request.getParameter("isFuncionesPersonalizadas") != null)
				obj.setFiltroFuncionesPersonalizadas(request
						.getParameter("isFuncionesPersonalizadas"));

			// if (obj.getCodEstadosResponsable() == null)
			// obj.setCodEstadosResponsable("REGI");

			if (accion != null)
				if (accion.equals("RETORNO"))
					accion = null;

			if (accion != null && !accion.equals("")) {
				if (request.getParameter("idNivelGobierno") != null)
					idNivelGobierno = Integer.parseInt(request.getParameter(
							"idNivelGobierno").toString());

				if (request.getParameter("idSector") != null)
					idSector = Integer.parseInt(request
							.getParameter("idSector").toString());

				if (request.getParameter("idResponsable") != null
						& !request.getParameter("idResponsable").equals(""))
					idResponsable = Integer.parseInt(request.getParameter(
							"idResponsable").toString());

				if (request.getParameter("codRegimen") != null
						&& !request.getParameter("codRegimen").trim()
								.equals(""))
					codRegimen = request.getParameter("codRegimen");

				if (request.getParameter("codProfesion") != null
						&& !request.getParameter("codProfesion").trim()
								.equals(""))
					codProfesion = request.getParameter("codProfesion");
				// Se agrega filtro con funciones personalizadas
				if (request.getParameter("isFuncionesPersonalizadas") != null
						&& !request.getParameter("isFuncionesPersonalizadas")
								.trim().equals(""))
					funcionesPersonalizadas = request
							.getParameter("isFuncionesPersonalizadas");

				if (request.getParameter("fecRegistro") != null
						&& !request.getParameter("fecRegistro").trim()
								.equals(""))
					fecRegistro = request.getParameter("fecRegistro");

				if (request.getParameter("fecValidacion") != null
						&& !request.getParameter("fecValidacion").trim()
								.equals(""))
					fecValidacion = request.getParameter("fecValidacion");

				if (request.getParameter("fecRegistroFin") != null
						&& !request.getParameter("fecRegistroFin").trim()
								.equals(""))
					fecRegistroFin = request.getParameter("fecRegistroFin");

				if (request.getParameter("fecValidacionFin") != null
						&& !request.getParameter("fecValidacionFin").trim()
								.equals(""))
					fecValidacionFin = request.getParameter("fecValidacionFin");

				if (request.getParameter("fecHabilita") != null
						&& !request.getParameter("fecHabilita").trim()
								.equals(""))
					fecHabilita = request.getParameter("fecHabilita");

				if (request.getParameter("fecHabilitaFin") != null
						&& !request.getParameter("fecHabilitaFin").trim()
								.equals(""))
					fecHabilitaFin = request.getParameter("fecHabilitaFin");

				/*
				 * if (idNivelGobierno == 2) { if
				 * (request.getParameter("idSector") != null) { if
				 * (!(request.getParameter("idSector").equals(""))) { idSector =
				 * Integer
				 * .parseInt(request.getParameter("idSector").toString()); if
				 * (idSector != 0) { obj.setIdSector(idSector);
				 * obj.setPliegos(capacidadesService.ObtenerPliegos(idSector));
				 * } } } }
				 * 
				 * 
				 * if (accion.equals("REFRESCARSEC")) { obj.setIdPliego(0);
				 * idPliego = null; } else if (request.getParameter("idPliego")
				 * != null & idSector != null) { if
				 * (!(request.getParameter("idPliego").equals("")) & idSector !=
				 * 0) { idPliego =
				 * Integer.parseInt(request.getParameter("idPliego"
				 * ).toString()); obj.setIdPliego(idPliego); } }
				 */
				String ubigeo = "";
				if (coddep != null && !coddep.equals("0"))
					ubigeo = coddep;
				if (codpro != null && !codpro.equals("0"))
					ubigeo += codpro;
				if (coddis != null && !coddis.equals("0"))
					ubigeo += coddis;

				if (request.getParameter("idEjecutora") != null
						& idNivelGobierno != null) // & idPliego != null
				{
					if (!(request.getParameter("idEjecutora").equals(""))) // &
																			// idPliego
																			// !=
																			// 0
					{
						idEjecutora = Integer.parseInt(request.getParameter(
								"idEjecutora").toString());
						obj.setIdEjecutora(idEjecutora);
						obj.setEjecutoras(capacidadesService
								.ObtenerEjecutorasNivelGobierno(
										idNivelGobierno, ubigeo, idSector));
					}
				}
				obj.setCoddep(coddep);

				if (coddep != null) {
					if (!coddep.equals("0")) {
						obj.setCoddep(coddep);
						obj.setProvincias(capacidadesService
								.ObtenerProvincias(coddep));
					}
				}

				if (accion.equals("REFRESCARDEP")) {
					obj.setCodpro("0");
					codpro = null;
					accion = "REFRESCAR";
				}

				if (codpro != null) {
					obj.setCodpro(codpro);
					if (!codpro.equals("") & !(codpro.equals("0"))) {
						obj.setDistritos(capacidadesService.ObtenerDistritos(
								coddep, codpro));
					}
				}
			} else
				obj.setAccion("REFRESCAR");

			obj.setIdNivelGobierno(idNivelGobierno);
			obj.setIdSector(idSector);

			obj.setNivelGobiernos(capacidadesService.ObtenerNivelGobiernos());
			obj.setDepartamentos(capacidadesService.ObtenerDepartamentos());
			obj.setCodRegimen(codRegimen);
			obj.setCodProfesion(codProfesion);
			// se agrega filtro con funciones personalizadas
			obj.setFiltroFuncionesPersonalizadas(funcionesPersonalizadas);
			obj.setFecRegistro(fecRegistro);
			obj.setFecValidacion(fecValidacion);
			obj.setFecHabilita(fecHabilita);

			obj.setFecRegistroFin(fecRegistroFin);
			obj.setFecValidacionFin(fecValidacionFin);
			obj.setFecHabilitaFin(fecHabilitaFin);

			Integer idAmbito = 0;
			idSistema = 0;

			if (idNivelGobierno == 2)
				obj.setSectores(capacidadesService.ObtenerSectors());

			obj.setSistemas(capacidadesService.ObtenerSistema());

			if (request.getParameter("idAmbito") != null
					&& request.getParameter("idAmbito") != ""
					&& request.getParameter("idAmbito") != "0") {
				idAmbito = Integer.parseInt(request.getParameter("idAmbito"));
				obj.setIdAmbito(idAmbito);
			}

			if (request.getParameter("idSistema") != null) {
				idSistema = Integer.parseInt(request.getParameter("idSistema"));
				obj.setIdSistema(idSistema);
			}
			if (idSistema != 0) {
				Iterator itr = null;
				Sistema s = null;
				itr = obj.getSistemas().iterator();
				if (itr != null) {
					Integer row = 0;
					while (itr.hasNext()) {
						row += 1;
						s = (Sistema) itr.next();
						if (s.getId_sistema().intValue() == idSistema) {
							obj.setAmbitos(capacidadesService
									.ObtenerAmbito(idSistema));
							if (s.getCon_ambitos().equals("1")) { // el sistema
																	// tiene más
																	// de 1
																	// ambito
								conAmbito = "1";
							} else { // si tiene 1 ambito siempre se selecciona
										// a este
								idAmbito = obj.getAmbitos().getFirst()
										.getId_ambito().intValue();
								obj.setIdAmbito(idAmbito);
							}
						}
					}
				}
			}
			obj.setConAmbito(conAmbito);
			if (request.getParameter("id_sistema_etapa") != null && !request.getParameter("id_sistema_etapa").equals(""))
				obj.setId_sistema_etapa(Integer.parseInt(request
						.getParameter("id_sistema_etapa")));

			LinkedList<SistemaEtapa> listaSistemaEtapa = capacidadesService
					.ObtenerSistemaEtapa();
			obj.setSistemaEtapa(listaSistemaEtapa);
			// set valores de los controles

			if (accion != null) {
				String nombres = (String) request.getParameter("nombres");
				if (nombres != null)
					obj.setNombres(nombres.toUpperCase().trim());
				String apellidosPaterno = (String) request
						.getParameter("apellidosPaterno");
				if (apellidosPaterno != null)
					obj.setApellidos_paterno(apellidosPaterno.toUpperCase()
							.trim());
				String apellidosMaterno = (String) request
						.getParameter("apellidosMaterno");
				if (apellidosMaterno != null)
					obj.setApellidos_materno(apellidosMaterno.toUpperCase()
							.trim());
				String dni = (String) request.getParameter("dni");
				if (dni != null)
					obj.setDni(dni.trim());
				if (coddep != null)
					obj.setCoddep(coddep);
				if (codpro != null)
					obj.setCodpro(codpro);
				if (coddis != null)
					obj.setCoddis(coddis);
				if (request.getParameter("correo") != null)
					correo = (String) request.getParameter("correo");
				obj.setCorreo(correo);
			}
			obj.setMensaje("");
			// Ejecutar la busqueda
			if (accion != null)
				if (accion.equals("DEL")) {
					JspResponsableEdicion jspResponsableEdicion = new JspResponsableEdicion();
					Responsable responsable = new Responsable();
					responsable.setId_responsable(idResponsable);
					jspResponsableEdicion.setResponsable(responsable);
					jspResponsableEdicion.setId_ambito(idAmbito);
					capacidadesService
							.EliminarParticipante(jspResponsableEdicion);
					accion = "BUSCAR";
				}

			codEstadosResponsable = (String) request
					.getParameter("codEstadosResponsable");

			if (codEstadosResponsable != null)
				obj.setEstadoRegistro(codEstadosResponsable);

			obj.setAccion(accion);

			if (accion != null) {
				if (!accion.equals("BUSCAR"))
					objPrevio = (ResponsableBusqueda) session
							.getAttribute("OBJ_RESP_BUSQ");
				if (accion.equals("BUSCAR"))
					session.setAttribute("OBJ_RESP_BUSQ", obj);
			}
		} else {
			obj = (ResponsableBusqueda) session.getAttribute("OBJ_RESP_BUSQ");
			if (obj != null)
				codEstadosResponsable = obj.getEstadoRegistro();
		}

		// Obtener resultados de busquedas
		accion = obj.getAccion();
		List<RptResponsableBusqueda> RptResponsables = null;
		String vSql = "";
		if (accion != null)
			if (accion.equals("BUSCAR")) {
				vSql = censoService.obtenerRptQueryResponsables(obj);
				RptResponsables = censoService.obtenerResponsableBusqueda(vSql);
				session.setAttribute("QUERY", vSql);
			} else {
				if (objPrevio != null) {
					vSql = censoService.obtenerRptQueryResponsables(objPrevio);
					RptResponsables = censoService
							.obtenerResponsableBusqueda(vSql);
				}
			}
//System.out.println(vSql);
		if (RptResponsables == null && accion == null) {
			// El usuario no dese que la grilla se cargue con datos por defecto
			/*
			 * ResponsableBusqueda vobj = new ResponsableBusqueda();
			 * RptResponsables =
			 * capacidadesService.ObtenerResponsableBusqueda(vobj
			 * ,codEstadosResponsable); vSql =
			 * capacidadesService.ObtenerRptQueryResponsables(obj,
			 * codEstadosResponsable); session.setAttribute("OBJ_RESP_BUSQ",
			 * obj); session.setAttribute("QUERY", vSql);
			 * if(obj.getMensaje().equals("")){ if(accion == null)
			 * obj.setMensaje("Seleccione criterios de busqueda");
			 * if(RptResponsables == null)
			 * obj.setMensaje("Sin resultados para mostrar.");
			 * if(RptResponsables != null && RptResponsables.size() == 0)
			 * obj.setMensaje
			 * ("Ninguna coincidencia para los filtros seleccionados.");
			 * if(RptResponsables != null && RptResponsables.size() > 0)
			 * obj.setMensaje("Total: "+ RptResponsables.size()+
			 * " coincidencia para los filtros seleccionados."); }
			 * obj.setEstadoRegistro("REGI");
			 */
		}

		if (obj.getMensaje().equals("")) {
			if (RptResponsables == null)
				obj.setMensaje("Sin resultados para mostrar.");
			if (RptResponsables != null && RptResponsables.size() == 0)
				obj.setMensaje("Ninguna coincidencia para los filtros seleccionados.");
			if (RptResponsables != null && RptResponsables.size() > 0)
				obj.setMensaje("Total " + RptResponsables.size()
						+ " coincidencia para los filtros seleccionados.");
		}

		request.setAttribute("DATALIST", RptResponsables);
		obj.setAccion("BUSCAR");
		// String verNoHablitados = "";

		if (RptResponsables != null) {
			if (RptResponsables.size() > 0)
				obj.setConResultado("1");
			else
				obj.setConResultado("0");
		} else {
			obj.setConResultado("0");
		}

		if (adCorreo) {
			capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario, 1);
			obj.setMensaje("Total "
					+ RptResponsables.size()
					+ " responsables cargados para participantes de pruebas de diagnóstico.");
		}

		if (adParticipante) {
			capacidadesService.cargarResultadosBusqueda(vSql, dniUsuario, 2);
			obj.setMensaje("Total "
					+ RptResponsables.size()
					+ " responsables cargados para participantes de pruebas de diagnóstico.");
		}
		if (adFechaFinalizacionMasiva){
			total = capacidadesService.fechaFinalizacionMasiva(vSql, fechaFinalizacion);
			obj.setMensaje("Total "
					+ total
					+ " responsables modificados.");
		}
		// 
		if (adHabilitacionMasiva){
			total = capacidadesService.habilitacionMasiva(vSql, fecHabilitacion, plazo);
			obj.setMensaje("Total "
					+ total
					+ " responsables habilitados.");
		}
		
		Integer idPerfil = 2;
		if (session.getAttribute("perfil") != null)
			idPerfil = (Integer) session.getAttribute("perfil");
		obj.setIdPerfil(idPerfil);

		return obj;
	}

}
